package br.com.equus.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.arquitetura.DAO.UniversalDAO;
import br.com.equus.DAO.AnimalDAO;
import br.com.equus.dto.PesquisarAnimalDTO;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.ControleMatriz;
import br.com.equus.entidade.ControleReceptora;
import br.com.equus.entidade.Proprietario;
import br.com.equus.service.AnimalService;

@Service(value = "animalService")
@Transactional(readOnly = true, rollbackFor = Exception.class, propagation = Propagation.SUPPORTS)
public class AnimalServiceImpl implements AnimalService {

	@Autowired(required = true)
	@Qualifier(value = "universalDAO")
	protected UniversalDAO dao;

	@Autowired(required = true)
	@Qualifier(value = "animalDAO")
	protected AnimalDAO animalDAO;

	@Override
	public Long countAnimal(PesquisarAnimalDTO dto) throws Exception {
		return animalDAO.countAnimal(dto);
	}

	@Override
	public List<Animal> paginateAnimal(int first, int pageSize, PesquisarAnimalDTO dto) throws Exception {
		return animalDAO.paginateAnimal(first, pageSize, dto);
	}

	@Override
	@Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
	public void salvarReproducaoF(ControleReceptora controleReceptora, Animal animal) throws Exception {
		dao.save(controleReceptora);

		animal = (Animal) dao.get(Animal.class, animal.getId());
		if (animal.getQtdParto() != null) {
			animal.setQtdParto(animal.getQtdParto() + 1);
		} else {
			animal.setQtdParto(1);
		}
		dao.merge(animal);

	}

	@Override
	@Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
	public void salvarMatriz(ControleMatriz controleMatriz, Animal animal) throws Exception {
		dao.save(controleMatriz);

		animal = (Animal) dao.get(Animal.class, animal.getId());
		if (animal.getQtdParto() != null) {
			animal.setQtdParto(animal.getQtdParto() + 1);
		} else {
			animal.setQtdParto(1);
		}
		dao.merge(animal);
	}

	@Override
	@Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
	public void deleteMatriz(ControleMatriz model, Animal animal) throws Exception {

		if (model.getFlgEmbriaoEfetivado() != null && model.getFlgEmbriaoEfetivado()) {
			if (animal.getQtdParto() == null || animal.getQtdParto() == 0) {
				animal.setQtdParto(0);
			} else {
				animal.setQtdParto(animal.getQtdParto() - 1);
			}
		} else if (model.getFlgEmbriaoEfetivado() != null && !model.getFlgEmbriaoEfetivado()) {
			if (animal.getQtdAborto() == null || animal.getQtdAborto() == 0) {
				animal.setQtdAborto(0);
			} else {
				animal.setQtdAborto(animal.getQtdAborto() - 1);
			}
		}

		dao.remove(ControleMatriz.class, model.getId());

		dao.merge(animal);

	}

	@Override
	@Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
	public void saveMatrizEfetivada(ControleMatriz animalEfetivado, Animal animal) throws Exception {
		dao.save(animalEfetivado);
		dao.merge(animal);

	}

	@Override
	public List<Proprietario> carregaProprietario(String query)
			throws Exception {
	
		return animalDAO.carregaProprietario(query);
	}
}
